/*
在创建元素的时候, 需要处理props, 事件, dom属性 等之类的。
但创建元素, 更新元素, 卸载的时候逻辑并不一样(如 静态class属性只会在创建的时候创建)
*/

import { isObject } from "../../help";

/*
    专门处理class, 包括静态class与:class
    <div class='a b' :class='{c: true}'></div>
*/
function mergeClass(classDefine){
    // [] {} '1' 1
    if (Array.isArray(classDefine)){
        return mergeArray(classDefine)
    }else if (isObject(classDefine)){
        return mergeObject(classDefine)
    }else if (classDefine != null){
        return classDefine;
    }
    return '';
}
function mergeArray(array){
    // :class='[1, true&&'a']'
    let result = '';
    for (let i=0; i<array.length; i++){
        const cls = mergeClass(array[i]);
        if (cls){
            result += cls + ' ';
        }
    }
    return result;
}
function mergeObject(object){
    let result = '';
    const keys = Object.keys(object);
    for(let i=0; i<keys.length; i++){
        const key = keys[i];
        const value = object[key];
        if (!!value){
            result += key + ' ';
        }
    }
    return result;
}
function genClassForVnode(vnode){
    const data = vnode.data || {};
    let result = '';
    // 静态class
    if (data.staticClass){
        result += data.staticClass + ' ';
    }
    // 动态class
    if (data.class){
        result += mergeClass(data.class);
    }
    return result.trim();
    // const staticClass = vnode.
}
function updateClass(oldVnode, vnode){
    // 提取 静态class 跟 :class 然后合成新的class字符串.
    const cls = genClassForVnode(vnode);
    if (cls != '' && vnode.elm._prevClass !== cls){
        vnode.elm.setAttribute('class', cls);
        vnode.elm._prevClass = cls;
    }
}
export default{
    create: updateClass,
    update: updateClass
}